/*-------------------------------------------------------------------------
 *
 * scram-common.h
 *		SCRAM 身份验证使用的辅助函数的声明
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/common/scram-common.h
 *
 *-------------------------------------------------------------------------
 */
#ifndef SCRAM_COMMON_H
#define SCRAM_COMMON_H

#include "common/cryptohash.h"
#include "common/sha2.h"

/* IANA规定的SCRAM机制名称 */
#define SCRAM_SHA_256_NAME "SCRAM-SHA-256"
#define SCRAM_SHA_256_PLUS_NAME "SCRAM-SHA-256-PLUS"	/* 带通道绑定 */

/* SCRAM密钥的长度（客户端和服务器） */
#define SCRAM_KEY_LEN				PG_SHA256_DIGEST_LENGTH

/* HMAC的长度 */
#define SHA256_HMAC_B				PG_SHA256_BLOCK_LENGTH

/*
 * 在认证交换中生成的随机随机数的大小。 这是“原始”字节数，
 * 发送的实际随机数仅使用ASCII可打印字符进行编码。
 */
#define SCRAM_RAW_NONCE_LEN			18

/*
 * 生成新秘密时盐的长度，以字节为单位。 （它将被存储
 * 并通过网络以Base64编码发送。）16字节是
 * RFC 7677中的示例所使用的。
 */
#define SCRAM_DEFAULT_SALT_LEN		16

/*
 * 生成秘密时的默认迭代次数。 应至少为
 * 4096，符合RFC 7677的规定。
 */
#define SCRAM_DEFAULT_ITERATIONS	4096

extern int	scram_SaltedPassword(const char *password, const char *salt,
								 int saltlen, int iterations, uint8 *result,
								 const char **errstr);
extern int	scram_H(const uint8 *str, int len, uint8 *result,
					const char **errstr);
#ifdef FDD
extern int fdb_hmac(const uint8 *password,int	password_len, const uint8 *salt, int saltlen, 
            int iterations, pg_cryptohash_type type,	 uint8 *result, const char **errstr);
extern int fdb_cryptohash_binary(const uint8 *input, int len, pg_cryptohash_type type, uint8 *result, const char **errstr);
extern int fdb_cryptohash(const uint8 *input, int len, pg_cryptohash_type type,  char *result, const char **errstr);
#endif
extern int	scram_ClientKey(const uint8 *salted_password, uint8 *result,
							const char **errstr);
extern int	scram_ServerKey(const uint8 *salted_password, uint8 *result,
							const char **errstr);

extern char *scram_build_secret(const char *salt, int saltlen, int iterations,
								const char *password, const char **errstr);

#endif							/* SCRAM_COMMON_H */
